package com.lz.netty.consumer2.project.netty;

import com.lz.netty.consumer2.project.netty.codec.ObjDecoder;
import com.lz.netty.consumer2.project.netty.codec.ObjEncoder;
import com.lz.netty.consumer2.project.netty.domain.MsgInfo;
import io.netty.channel.ChannelInitializer;
import io.netty.channel.socket.SocketChannel;
import io.netty.handler.codec.http.HttpObjectAggregator;
import io.netty.handler.codec.http.HttpServerCodec;
import io.netty.handler.codec.http.websocketx.WebSocketFrameAggregator;
import io.netty.handler.stream.ChunkedWriteHandler;
import io.netty.handler.timeout.IdleStateHandler;

import java.util.concurrent.TimeUnit;

/**
 * 用来进行设置出站解码器和入站编码器。
 * 使用场合：客户端和服务端之间消息的传递包含特殊字符需要统一编码格式时，在客户端和服务端加上ChannelInitializer继承类，重写initChannel方法，设置编码和解码格式。
 * 但当传输的数据不包含特殊字符例如报文时，客户端和服务端不需要写ChannelInitializer继承类。
 * */
public class MyChannelInitializer extends ChannelInitializer<SocketChannel> {

    @Override
    protected void initChannel(SocketChannel channel) {
        //对象传输处理
        channel.pipeline().addLast(new ObjDecoder(MsgInfo.class));
        channel.pipeline().addLast(new ObjEncoder(MsgInfo.class));
        // 心跳时间
        channel.pipeline().addLast("idle", new IdleStateHandler(0, 0, 60, TimeUnit.SECONDS));
        // 对http协议的支持.
        channel.pipeline().addLast(new HttpServerCodec());
        // 对大数据流的支持
        channel.pipeline().addLast(new ChunkedWriteHandler());
        // 聚合 Http 将多个requestLine、requestHeader、messageBody信息转化成单一的request或者response对象
        channel.pipeline().addLast(new HttpObjectAggregator(8192));
        // 聚合 websocket 的数据帧，因为客户端可能分段向服务器端发送数据
        channel.pipeline().addLast(new WebSocketFrameAggregator(1024 * 62));
        // 在管道中添加我们自己的接收数据实现方法
        channel.pipeline().addLast(new MyClientInHandler());
        // 在管道中添加我们自己的发送数据实现方法
        channel.pipeline().addLast(new MyClientOutHandler());
    }

}